Quick learn
http://www.quora.com/How-can-I-quickly-improve-my-programming-skills Start by carving out 20% of your time to devote to your own skills development. If possible, it'll be better if that 20% comes from one or two hours a day rather than a day a week because you can then make a daily habit out of improving your skills. Your productivity may decrease initially (or it might not change much if you're replacing web surfing or other distractions), but the goal is to make investments that will make you more effective in the long run. So what should you do with that 20% time? Since you're at a well-known tech company, you should take advantage of the resources available to you. Here are 10 suggestions: *'Study code on core abstractions written by the best engineers at the company, and understand why certain choices were made and how they were implemented'. For example, if you're at Google, read through code in some of the core libraries written by early engineers like Jeff Dean, Craig Silverstein, or Ben Gomes. Start with ones that you've used before, and ask yourself if you would've written similar code for various parts and how you might learn from their examples. *'If you're not too efficient on your text editor or IDE, ask some of your more effective co-workers if they'd mind you watching them for a bit while they're coding.' Are they using keyboard shortcuts or editor functionality that you're not familiar with but that make them much more efficient? If so, learn and practice them. Search for productivity tips on Google for whatever development environment you use. When I was first learning Emacs, for example, Steve Yegge's very good 10 Specific Ways to Improve Your Productivity With Emacs made me noticeably more efficient. Even in re-reading parts of that page for this answer, I've learned something new. *'Read through any technical, educational material available internally.' Google, for instance, has a wide array of codelabs that teach core abstractions and high-quality guides of best practices that veteran engineers have written for various languages based on decades of experience. If your company doesn't have similar resources, Google's open sourced some of their guides: https://code.google.com/p/google.... *'Master the programming language(s) that you use'. Read a good book or two on the languages. Focus on developing a solid grasp of the advanced concepts in that language, and gain familiarity with core, language libraries. Make sure that at least one of your languages is a scripting language (e.g. Python) that you can use as your Swiss army knife for quick tasks. *'Send your code reviews to the harshest critics.' Optimize for getting good, thoughtful feedback rather than for lowering the barrier to getting your work checked in. Ask for a more detailed review on implementations that you're not too confident about. *'Enroll in classes in areas you want to be stronger at.' These could be ones offered on the company campus, on nearby university campuses, or online. Many of the larger tech companies will even pay for your classes. If you want to get better at programming, take more hands-on classes on topics like design patterns or on some programming language. *'Build a good reading list of technical books, and start reading.' Your company may even reimburse you. Here's a start: What is the single most influential book every programmer should read? *'Work on different types of projects, and use them as learning opportunities. '''If you find yourself always doing similar tasks using similar methods, it's going to be hard to get out of your comfort zone and to pick up new skills. *'Make sure you're on a team with at least a few senior engineers that you feel like you can learn from.' If you're not, consider changing projects or teams. This'll help increase your learning rate for the remaining 80% of your time. *'Write more code.''' If you feel like programming is your weak point, spend more of your time on building and writing code since you won't get better unless you practice the craft. To the extent that you can, shift time away from other engineering-related duties like managing projects, fixing bugs, attending meetings, designing products, etc.